home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Programming / PPCpack / mixed.txt < prev    next >
Text File  |  1998-04-16  |  5KB  |  157 lines

  1. D) Mixed Binaries
  2. =================
  3.  
  4. Actually there are two similar ones:
  5.  
  6. 1) Mixed Binaries
  7.  
  8. These files contain both PPC and 68k code. Some functions (the ones
  9. that will profit most of the PPC) are done in PPC Code, others in
  10. 68k Code. Mixed Binaries are useful for "quick porting", especially
  11. concerning Projects that were 100% 68k ASM at the start.
  12.  
  13. 2) Fat Binaries
  14.  
  15. These contain PPC and 68k versions of ALL functions of the program.
  16. The program runs on PPC-Systems and 68k systems (big advantage), but
  17. the executable size is twice the normal size. Before you start a
  18. Fat Binary, think, if using two versions with two different project
  19. files (and two executables) is not better for your purpose. Fat Binaries
  20. are a bit more complicated to code and really ... BIG.
  21.  
  22. The main interesting application for Fat Binaries are "Mixed-Fat-Libraries",
  23. like described in the document libs.txt.
  24.  
  25. This document explains how to create Mixed and Fat Binaries. I assume you
  26. already read c.txt.
  27.  
  28. 1) Mixed Binaries
  29. -----------------
  30.  
  31. The principial steps to create a Mixed Binary would be:
  32.  
  33. - Start a StormC Project File
  34. - Select Mixed Binary and Amiga-OS Mixed Binary and Debugversion as Options
  35.  
  36. It is VERY important that, when the Mixed Binary is compiled for the first
  37. time, it is compiled with "Debugversion" enabled. StormC needs this to create
  38. the files for the Automatic Contextswitch. Later compiles, after the initial
  39. one, don't need anymore "Debugversion" to be set then, so you can change
  40. the Options in the StormC Settings after the initial compile, if you want.
  41.  
  42. Now StormC will create two project Files, one of them having the ending _PPC.
  43. The PPC Project will be included into the 68k Project by StormC. Now you code
  44. all files, that should be PPC-Native into the PPC-Project, and all files, that
  45. should be 68k, into the 68k-Project.
  46.  
  47. - Then you compile the PPC Project
  48. - After this you include the object file(s) of the PPC Project to the 68k
  49.   Project (important !!!)
  50. - Now you compile the 68k project, and everything is done.
  51.  
  52. Note, that you do not need any "special PPC Stuff", everything is done automatically
  53. by the Compiler. Of course you have to follow the general guidelines as to
  54. PPC Coding (for example not using 68k registers in PPC Code) like outlined in c.txt.
  55.  
  56. Think careful about:
  57.  
  58. - Does this program make sense as Mixed Binary ? (Would using two project files,
  59.   one for 68k, one for PPC, not make more sense ?)
  60. - Which functions make sense for putting them into PPC Code
  61.  
  62. Note:
  63.  
  64. - 68k and PPC can SHARE their Global Variables. You simply do a extern-declaration
  65.   in the other module.
  66. - main() is always in 68k, in a Mixed Binary
  67.  
  68. Example:
  69.  
  70. test.c
  71. ------
  72.  
  73. int bla=3;
  74. void main
  75. {
  76.  ppctest();
  77. }
  78.  
  79. test_PPC.c
  80. ----------
  81.  
  82. #include <stdio.h>
  83.  
  84. extern int bla; // Global Variable Sharing
  85.  
  86. void ppctest(void)
  87. {
  88.  printf("%i\n",bla);
  89. }
  90.  
  91. 2) Fat Binaries
  92. ---------------
  93.  
  94. The main difference between Fat Binaries, is, that (nearly) all functions exist in two versions,
  95. one for 68k, one for PPC. For an 68k system always the 68k version will be used, for
  96. a PPC Systems, sometimes the PPC version will be used. Note, that sometimes 68k functions
  97. might be used even on a PPC System (in functions that contain a LOT of OS-Calls for example,
  98. to reduce the number of Contextswitches). Reducing Contextswitches is REALLY important.
  99.  
  100. Example:
  101.  
  102. test.c
  103. ------
  104.  
  105. #include <clib/exec_protos.h>
  106. #include <pragma/exec_lib.h>
  107. #include <exec/libraries.h>
  108.  
  109. struct Library *PowerPCBase=0;
  110.  
  111. void test68k()
  112. {
  113.  printf("68k!\n");
  114. }
  115.  
  116. void main()
  117. {
  118.  PowerPCBase=OpenLibrary("powerpc.library",7);
  119.  if (PowerPCBase) testPPC();
  120.  else test68k();
  121. }
  122.  
  123. test_PPC.c
  124. ----------
  125.  
  126. void testPPC()
  127. {
  128.  printf("PPC!\n");
  129. }
  130.  
  131. Note, that an easier way exists to find out if a 68k or a PPC System exists... this
  132. example is only for example purposes :)
  133.  
  134. As you see, doing a Fat Binary is some work. Consider doing two versions (one for 68k,
  135. one for PPC, using the __PPC__ for special code) instead. The Source will look much
  136. better and easier portable this way. But well, Fat Binaries HAVE their advantages
  137. (especially when used for Shared Libraries, see libs.txt about this).
  138.  
  139. One last note:
  140.  
  141. The Automatic Contextswitch cannot switch to functions with register-parameters
  142. (the only exeption for this rule are Shared library functions, which it CAN handle,
  143. even as register-parameters are used). If you need to call a 68k function with
  144. register parameters that is NOT a Shared Library function, there are two ways:
  145.  
  146. A) calling a 68k function without register parameters, which then calls the
  147.    function WITH register parameters.
  148. B) Doing a manual Contextswitch
  149.  
  150. Note, that A) or B) also has to be used, if you want to call a 68k Shared Library
  151. function inside of the IMPLEMENTATION of the library (once the library is compiled,
  152. you do not need A) or B), the Automatic Contextswitch can then handle this).
  153.  
  154. For more information about Shared Libraries, read libs.txt.
  155.  
  156.  
  157.